package redes1.unidade2;

public class FuncoesAuxiliares {

	public FuncoesAuxiliares() {
	}

	/**
	 * Metodo RepresentaBinariosEmString: armazena em uma string os bits dos
	 * bytes correspondentes aos caracteres de uma string recebida.
	 * 
	 * @param String
	 *            mensagem eh uma string qualquer.
	 * @return String mensagemEmBinario contendo os bits da mensagem recebida.
	 */
	public String RepresentaBinariosEmString(String mensagem) {
		char mascara = 1 << 7; // comentar
		String stringByte = "", // recebe os bits de cada byte da mensagem
		mensagemEmBinario = ""; // armazenara' a mensagem final, completamente
								// codificada

		// para cada bit acrescenta 0 ou 1 a stringByte
		for (char c : mensagem.toCharArray()) {
			for (int bit = 1; bit <= 8; bit++) {
				stringByte += ((c & mascara) == 0 ? '0' : '1'); // comparacao
																// bit a bit
																// entre o
																// caracter e a
																// mascara
				c <<= 1; // deslocamento de um bit no caracter
			} // fim do for
			mensagemEmBinario += stringByte;
			stringByte = "";
		} // fim do for
		return mensagemEmBinario;
	} // fim do metodo RepresentaBinariosEmString

	/**
	 * Metodo DecodificaByte: decodifica uma string contendo 0s e 1s que
	 * representam um byte para o seu respectivo caracter ascii. Parametros:
	 * String stringByte representando um byte. Retorno: String charAscii com um
	 * caracter.
	 */
	public String DecodificaByte(String stringByte) {
		int decimal = 0, // contera' resultado da decodificao
		bit = stringByte.length() - 1; // decresce de 7 a 0

		// cada bit, aplica a transformacao de binario para decimal: 2^i * (0|1)
		for (int i = 0; i < stringByte.length(); i++) // cresce de 0 a 7
		{
			decimal += ((int) Math.pow(2, i))
					* (Integer.parseInt(stringByte.charAt(bit) + ""));
			bit--;
		} // fim do for
		String charAscii = ((char) decimal) + ""; // cast aplicado para passar
													// decimal como char a
													// charAscii
		return charAscii;
	} // fim do metodo DecodificaByte

	/**
	 * Metodo DecodificaStringDeBinarios: decodifica string contendo 0s e 1s
	 * para uma string normal (caracteres ascii). Parametros: String
	 * mensagemEmBits contendo 0s e 1s. Retorno: String mensagemDecodificada eh
	 * uma string com caracteres normais.
	 */
	public String DecodificaStringDeBinarios(String mensagemEmBits) {
		String mensagemDecodificada = ""; // recebera' a mensagem decodificada
		int inicioDoByte = 0, // aponta o inicio de cada byte
		fimDoByte = 0; // aponta o fim de cada byte

		// para cada byte, decodifica de binario para caracter
		while (fimDoByte < mensagemEmBits.length()) {
			if ((fimDoByte % 8) == 7) // reconhece um byte (8 bits)
			{
				// concatena byte decodificado 'a mensagem final
				mensagemDecodificada += DecodificaByte(mensagemEmBits
						.substring(inicioDoByte, fimDoByte + 1));
				inicioDoByte = fimDoByte + 1;
			} // fim do if
			fimDoByte++;
		} // fim do while
		return mensagemDecodificada;
	} // fim do metodo DecodificaStringDeBinarios

	/**
	 * Metodo BinarioParaDecimal: decodifica uma string contendo 0s e 1s que
	 * representam um numero em binario para o seu respectivo valor decimal.
	 * Parametros: String stringByte representando um numero em binario.
	 * Retorno: int decimal com um numero decimal.
	 */
	public int BinarioParaDecimal(String stringByte) {
		int decimal = 0, // contera' resultado da decodificao
		bit = stringByte.length() - 1; // decresce de 7 a 0

		// cada bit, aplica a transformacao de binario para decimal: 2^i * (0|1)
		for (int i = 0; i < stringByte.length(); i++) // cresce de 0 a 7
		{
			decimal += ((int) Math.pow(2, i))
					* (Integer.parseInt(stringByte.charAt(bit) + ""));
			bit--;
		} // fim do for
		return decimal;
	} // fim do metodo BinarioParaDecimal
}
